/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package chatclientedistribuidosmejorado;

import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;

import View.*;



/**
 *
 * @author Kleyvert
 */
public class Cliente implements Runnable
{

    //ATRIBUTOS:
   private Socket clienteConexion;
   private String ipServidor;

   private String nombreUsuario;
   private String nombreSala;

   public SalaGui ventana;
   private DataOutputStream msnSalida;
   private DataInputStream msnEntrada;

   //para el hilo de escuga de mensajes:
   public ClienteDaemonEscuchaMensajes clienteEscuchaMsj;


    //CONSTRUCTOR:

    public Cliente(String nombreUsuario, String nombreSala, SalaGui ventana) {
       this.nombreUsuario = nombreUsuario;
       this.nombreSala = nombreSala;
       //this.ventana = ventana;
    }

    public Cliente(String nombreUsuario, String nombreSala) {
       this.nombreUsuario = nombreUsuario;
       this.nombreSala = nombreSala;
       //this.ventana = ventana;
    }

   //METODOS:

    public Socket getClienteConexion() {
        return clienteConexion;
    }
    public void setClienteConexion(Socket clienteConexion) {
        this.clienteConexion = clienteConexion;
    }
    public String getIpServidor() {
        return ipServidor;
    }
    public void setIpServidor(String ipServidor) {
        this.ipServidor = ipServidor;
    }
    public DataInputStream getMsnEntrada() {
        return msnEntrada;
    }
    public void setMsnEntrada(DataInputStream msnEntrada) {
        this.msnEntrada = msnEntrada;
    }
    public DataOutputStream getMsnSalida() {
        return msnSalida;
    }
    public void setMsnSalida(DataOutputStream msnSalida) {
        this.msnSalida = msnSalida;
    }


    // levantar el cliente socket
   public void LevantarCliente(){
       ipServidor= "127.0.0.1";

        // colocamos el servidor como un "Demonio" escuchando conexiones

        try
        {
            clienteConexion = new Socket(ipServidor, 16555);
            System.out.println("Conectado al Socket: "+clienteConexion);

           // le asignamos la variable del tipo DataInputStrem de la conexion Sockets
            //Para la ENTRADA DE mensajes:
            this.msnEntrada = new DataInputStream(clienteConexion.getInputStream());
            //SALIDA DE MESAJES:
            this.msnSalida = new DataOutputStream(clienteConexion.getOutputStream());

            
            //salidaEnviada.writeInt(1);
            //this.msnSalida.writeUTF(nombreUsuario);
            //salidaEnviada.flush();
            
             
            System.out.println("Cliente.java, mensaje desde un cliente a los demas, aun no  entra en el switch: ");

            //1-demonio de escucha de mensajes:

            //ojo: dentro del RUN de este HILO SE CAE EN UN ERROR! CORREGIR:::
            Thread miclienteDaemonEscuchaMensajes = new Thread (new ClienteDaemonEscuchaMensajes(this, this.ventana));
            miclienteDaemonEscuchaMensajes.start();


            //2-demonio de esperar a que el cliente decida enviar un mensaje:

            System.out.println("Cliente.java, mensaje3 desde un cliente a los demas, aun no  entra en el switch: " + this.ventana.jTextArea2.getText());


            while (true)
            {
                //actualiza variables de entrada:

                //escucha de la GUI (SalaGui) el evento de presionat enter:


                switch (ventana.codigoMensajeEnviado)
                {

                    case 10:    //ENTER ASCII = 10, mensaje enviado!
                    {
                        //por consla, prueba:
                        System.out.println("Cliente.java, mensaje desde un cliente a los demas: " + this.ventana.jTextArea2.getText());

                        //mensaje:
                        this.enviarMensaje_al_servidor(this.ventana.jTextArea2.getText());

                        //re-settear a cero
                        this.ventana.codigoMensajeEnviado = 0;
                    }


                    default :   //false, CUALQUIER OTRA TECLA
                    {


                    }

                }//end switch

            }//end while



        }
        catch (IOException ex) {
            JOptionPane.showMessageDialog(null, "No se pudo establecer la conexión");
        }        // procesar la conexión.
       catch (Exception e)
        {

        }

       this.cerrarConexion();
   }

   /* public void EstablecerFlujosConexion() throws IOException
   {
      String mensaje = "";
      int opcion = 1;
      

       try{
           clienteConexion = new Socket(getIpServidor().toString(), 15400);
           // le asignamos la variable del tipo DataInputStrem de la conexion Sockets
            DataInputStream entrando = new DataInputStream(clienteConexion.getInputStream());
            // enviamos el nombre del usuario y la opcion = 1 para escribir en OutputStream del hilo
            enviarPaqueteGui(opcion, nombreUsuario);
            // El cliente queda en un ciclo indeterminado esperando que lleguen
            // nuevas entradas
            while(true){
                int codigoVerificar = entrando.readInt();
                String sTrama = entrando.readUTF();
                System.out.println("IMPRIMIO: "+ sTrama);
               
                if (codigoVerificar == 1){
                    ventana.nuevoUsuario(sTrama);
                }
                if (codigoVerificar == 2){
                       // ventana.mensajeRecibidoPorCadaUsuario(sTrama);
                }
            }
            //JOptionPane.showMessageDialog(ventana, "Se ha podido conectar");
        }catch(Exception e){
            JOptionPane.showMessageDialog(ventana, "No se pudo establecer la conexión");
        }
         
   }*/
   /*
     public void enviarPaqueteGui(int nCodigo, String sTrama){
        try{
            // instanciamos el objetos OutputStream de la conexion "Socket" clienteConexion
            DataOutputStream salidaEnviada = new DataOutputStream(clienteConexion.getOutputStream());
            // enviamos el codigo al metodo siguiente
            salidaEnviada.writeInt(nCodigo);
            salidaEnviada.writeUTF(sTrama);
           // salidaEnviada.flush();
        }catch(Exception e){
            JOptionPane.showMessageDialog(ventana, "No se pudo enviar el mensaje");
        }

    }*/


   // Metodo para cerrar la conexiones tanto de "espera" como de "salida"
   public void cerrarConexion()
   {
        try {
          
           clienteConexion.close();
        }
        catch( IOException excepcionES ) {
              excepcionES.printStackTrace();
        }
      System.out.println("Conexion finalizada");
   }


    // Es invocado cuando el CLiente escribe un mensaje en la GUI:
    public void enviarMensaje_al_servidor( String mensaje )
    {
        try
        {
            //this.ventana.jTextArea2

            // enviar al SERVIDOR:
            this.msnSalida.writeUTF( mensaje );

            // LIMPIAMOS LA CAJA DE TEXTO:
            this.ventana.limpiarTextArea_al_EnviarMensaje();

        }
        catch( IOException ie )
        {
            System.out.println( ie );
        }
    }


    
    public void run() 
    {
       this.LevantarCliente();
    }

}
